因為程式在吃 gets 之後,跑 puts 之後就會離開,所以我們要影響程式的執行路徑。
puts@got 的位置system() 位置因為我們可以蓋 RIP,故可以串起 ROP 攻擊鏈。
一開始我們需要找到程式中有 pop ret 的地方。在這程式中,剛好在 0x400753 中可以用。這個可以用 pwntools 或 peda (gdb 工具) 來找。
所以我們第一步會是把 RIP 蓋成 0x400753。
我們手上有這程式用的 libc ELF,所以我們可以透過 leak 某函式位置,倒推出 libc 的位置。
因為我們第一步已經會執行 pop ret,所以可以直接把接下來要執行的東西寫在後面。
pop ret 位置gets@got 位置puts@plt 位置libc 中 symbols 的位置此時我們若把這些東西送出去,就可以看到返回的 libc 中 system() 的位置。
利用這份資訊,在第二次送出時,即可用一樣的套路來執行 shell。
SECCON 2018 Online CTF Writeup - yyy